package com.rd.teacher.jichao.day03;

public class StringTest {

    public static void main(String[] args) {
//        String str = "zhang";
////        String str2 = "zhang";
//        String str1 = new String("zhang");
//        System.out.println(str == str1);
//        System.out.println(str == str2);
//        str = "san";

//        String str3 = new String("zhang");
//        System.out.println(str1 == str3);

        // 创建了几个对象
        String str = "";
        // A 0个  B 1个  C 2个

        // 答案： A 0个
        // 空串在jvm启动时会创建

        String str1 = "zhang";
        // 创建了一个对象, 在常量池中

        String str2 = "zhang" + "san";
        // A 1个  B 2个  C 3个
//        System.out.println(str1 == str2);
        // 编译器识别出两个常量相加，相当于声明一个常量，将其做了优化
        // 等价于  str2 = "zhangsan";

        String str3 = new String("zhang");
        // 创建了两个对象
        // 分别存在于常量池中和堆中

        String str4 = "zhang";
        String str5 = str4 + "san";
        // A 2个  B 3个  C 4个  D 5个
        // "zhang"对应1个常量池对象
        // "san"对应1个常量池对象
        // "zhangsan" 堆中  常量加上变量的情况
        //  3个对象

        // StringBuilder.append(str4)   「jdk8的处理」

        String str6 = "zhang ";
        String str7 = "hi" + "," + str6 + "san" + "!";
        // A 4个   B 5个  C 6个
        // "zhang " "hi," "san"  "!"  4个常量池中的对象
        // "hi,zhang san!"  1个堆中的对象
        // 在常量+变量+常量的情况下，变量前出现的常量可以合并，变量后出现的不能合并
        // 5个对象

    }
}
